package cn.kent.factoryMethodPattern;

import java.util.HashMap;

/**
 * 工厂方法模式还有一个非常重要的应用，就是延迟始化(Lazy initialization)，什么是延迟始化呢？
 * 一个对象初始化完毕后就不释放，等到再次用到得就不用再次初始化了，直接从内存过中拿到就可以了
 * 该类为上述实现类
 * <p>
 * 转map的这段代码，这个在类初始化很消耗资源的情况比较实用，
 * 比如你要连接硬件，或者是为了初始化一个类需要准备比较多条件(参数)，通过这种方式可以很好的减少项目的复杂程度。
 *
 * @author kent
 * @date 2021/5/8 16:59
 */
@SuppressWarnings("all")
public class HumanFactoryTwo {
    // 定义一个Map，初始化过的Human对象都放在这里
    private static HashMap<String, Human> humans = new HashMap<String, Human>();

    // 定一个烤箱，泥巴塞进去，人就出来了，这个太先进了
    public static Human createHuman(Class c) {
        // 定义一个类型的人
        Human human = null;

        try {
            if (humans.containsKey(c.getSimpleName())) {
                human = humans.get(c.getSimpleName());
            } else {
                human = (Human) Class.forName(c.getName()).newInstance();
                // 放到map中
                humans.put(c.getSimpleName(), human);
            }
        } catch (InstantiationException e) {
            //你要是不说个人种颜色的话，没法烤，要白的黑的，你说话了才好烤
            System.out.println("必须指定人种的颜色");
        } catch (IllegalAccessException e) {
            //定义的人种有问题，那就烤不出来了，这是...
            System.out.println("人种定义错误");
        } catch (ClassNotFoundException e) {
            //你随便说个人种，我到哪里给你制造去？！
            System.out.println("混蛋，你指定的人种找不到!");
        }
        return human;
    }
}
